package model

import (
	"fmt"
	"gitee.com/liumou_site/gcs"
	"gitee.com/liumou_site/gf"
	"gitee.com/liumou_site/logger"
	"runtime"
)

// CreateService 用于在Linux系统上创建并启动ddns-go服务。
// 该函数会检查当前系统是否为Linux，并确保配置文件和目标服务文件不存在。
// 然后，它会创建必要的目录，复制配置文件，并生成systemd服务文件。
// 最后，函数会重载systemd配置，启用并启动ddns-go服务。
//
// 参数:
//   - conf: 配置文件的路径，该文件将被复制到/etc/ddns-go/config.toml。
//
// 返回值:
//   - error: 如果过程中出现任何错误，返回相应的错误信息；否则返回nil。
func CreateService(conf string) error {
	file := "/usr/lib/systemd/system/ddns-go.service"
	run := gcs.NewShell()

	// 检查当前系统是否为Linux，如果不是则返回错误
	if runtime.GOOS != "linux" {
		return fmt.Errorf("当前系统不是Linux系统，无法创建服务")
	}
	// 判断当前系统是否可以使用 systemctl
	if !gf.Exists("/usr/bin/systemctl") {
		return fmt.Errorf("当前系统不支持systemctl，无法创建服务")
	}
	// 检查配置文件是否存在，如果不存在则返回错误
	if !gf.Exists(conf) {
		return fmt.Errorf("配置文件不存在")
	}
	// 检查ddns-go服务是否已存在，如果存在则返回错误
	if gf.Exists(file) {
		return fmt.Errorf("ddns-go服务已存在")
	}

	// 创建ddns-go配置目录
	run.RunShell("mkdir -p /etc/ddns-go")
	if run.Err != nil {
		logger.Error("创建ddns-go配置目录失败")
		return run.Err
	}
	// 复制配置文件到指定位置
	run.RunShell("cp -rf", conf, " /etc/ddns-go/config.toml")
	if run.Err != nil {
		logger.Error("复制配置文件失败")
		return run.Err
	}

	// 定义systemd服务文件内容
	text := `[Unit]
Description=ddns-go
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/ddns-go -c /etc/ddns-go/config.toml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Alias=ddns-go.service
`

	// 将服务文件内容写入指定路径
	w := gf.NewFile(file)
	w.Echo(text)
	if w.Err != nil {
		logger.Error("写入ddns-go服务失败: ", file)
		logger.Debug(w.Err)
		return w.Err
	}

	// 重载systemd配置
	run.RunShell("systemctl daemon-reload")
	if run.Err != nil {
		logger.Error("重载ddns-go服务失败")
		logger.Debug(run.Err)
		return run.Err
	}

	// 禁用并重新启用ddns-go服务，然后启动服务
	run.RunShell("systemctl disable ddns-go.service")
	run.RunShell("systemctl enable ddns-go.service")
	run.RunShell("systemctl start ddns-go.service")
	if run.Err != nil {
		logger.Error("启动ddns-go服务失败")
		logger.Debug(run.Err)
		return run.Err
	}
	logger.Info("ddns-go服务创建成功并已设置为开机自启")
	logger.Info("配置文件路径: /etc/ddns-go/config.toml")
	logger.Info("ddns-go服务路径: /usr/lib/systemd/system/ddns-go.service")
	logger.Info("启动命令: systemctl start ddns-go.service")
	return nil
}
